This markdown re-visits the hole analysis that was somewhat abandoned in the first pass. The goal was to capture changes in the internal structure of trait spaces, which traditional methods and approaches aren’t typically able to do so. To reveal such impacts I aim to detect “hole” within the bounds of a convex hull surrounding the observed hypervolumes. I defined holes in an analougous way to Blonder by encasing the observed hypervolume in an convex hull and then comparing the trait space to a “baseline” condition. Where we differ is that my baseline is defined as a null expectation contingent on the observed hypervolumes regional species pool, as opposed to all unoccupied trait space being considered a “hole”. Another difference can be seen in the clustering approach to group empty space into distinct “holes”. Blonder uses distance based clustering approaches, which is poor for detecting non-circular holes. I using density based clustering which defines holes based on the number of points within a minimum distance to each point. To accont for the sensitivity of hole detection to this minimum distance I create hole profiles calculating the number of holes and their size as this radius increases.
Intuitively, one would expect that bird communities in land uses of increasing human influence would display a greater erosion of their internal trait space, but we will see what we capture.
rm(list = ls())
require(mgcv) ## to perform GAMs
## Loading required package: mgcv
## Warning: package 'mgcv' was built under R version 4.1.3
## Loading required package: nlme
## This is mgcv 1.8-40. For overview type 'help("mgcv-package")'.
require(tidyverse) ## for data wrangling and piping
## Loading required package: tidyverse
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.6 v purrr 0.3.4
## v tibble 3.1.7 v dplyr 1.0.9
## v tidyr 1.2.0 v stringr 1.4.0
## v readr 2.1.2 v forcats 0.5.1
## Warning: package 'ggplot2' was built under R version 4.1.3
## Warning: package 'tibble' was built under R version 4.1.3
## Warning: package 'tidyr' was built under R version 4.1.3
## Warning: package 'readr' was built under R version 4.1.3
## Warning: package 'dplyr' was built under R version 4.1.3
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::collapse() masks nlme::collapse()
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
source("../Functions/TPD_3D_plots.R") ## my very own TPD functions
## Loading required package: gstat
## Warning: package 'gstat' was built under R version 4.1.3
## Loading required package: sf
## Warning: package 'sf' was built under R version 4.1.3
## Linking to GEOS 3.9.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE
## Loading required package: ggpubr
## Loading required package: magrittr
## Warning: package 'magrittr' was built under R version 4.1.3
##
## Attaching package: 'magrittr'
## The following object is masked from 'package:purrr':
##
## set_names
## The following object is masked from 'package:tidyr':
##
## extract
## Loading required package: rgl
## Warning: package 'rgl' was built under R version 4.1.3
## Loading required package: geometry
## Warning: package 'geometry' was built under R version 4.1.3
## Loading required package: fastcluster
##
## Attaching package: 'fastcluster'
## The following object is masked from 'package:stats':
##
## hclust
## Loading required package: Hmisc
## Warning: package 'Hmisc' was built under R version 4.1.3
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:dplyr':
##
## src, summarize
## The following objects are masked from 'package:base':
##
## format.pval, units
## Loading required package: magick
## Linking to ImageMagick 6.9.12.3
## Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fontconfig, x11
## Warning: package 'webshot2' was built under R version 4.1.3
## Warning in gzfile(file, "rb"): cannot open compressed file 'Functions/
## TPD_colours.rds', probable reason 'No such file or directory'
## Error in gzfile(file, "rb") : cannot open the connection
## Loading required package: dbscan
## Warning: package 'dbscan' was built under R version 4.1.3
## Loading required package: fpc
## Warning: package 'fpc' was built under R version 4.1.3
##
## Attaching package: 'fpc'
## The following object is masked from 'package:dbscan':
##
## dbscan
## Loading required package: factoextra
## Warning: package 'factoextra' was built under R version 4.1.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
PREDICTS_tpds <-
readRDS("../Outputs/PREDICTS_sites_tpds.rds") # morphometric TPDs of observed sites
PREDICTS_randomisations <-
readRDS("../Outputs/randomisations_TPD_morpho.rds") ## morphometric TPD of randomisised sites
PREDICTS_full <- readRDS("../Outputs/refined_predicts.rds")
PREDICTS <- PREDICTS_full %>% ## PREDICTS data
dplyr::distinct(SSBS, Predominant_habitat, Realm, SS) %>% ## pull out land_use type, Subregion, realm etc
dplyr::mutate(
Predominant_habitat = ifelse(
grepl(
Predominant_habitat,
pattern = "secondary",
ignore.case = TRUE
),
"Secondary vegetation",
paste(Predominant_habitat)
),
Predominant_habitat = ifelse(
grepl(
Predominant_habitat,
pattern = "primary",
ignore.case = TRUE
),
"Primary vegetation",
paste(Predominant_habitat)
)
) %>% data.frame() ## merge all secondary sites together
TPD_land_uses <-
data.frame(SSBS = names(PREDICTS_tpds)) %>% dplyr::left_join(PREDICTS, by = "SSBS") %>% dplyr::filter(Predominant_habitat != "Cannot decide")
### check a table
table(TPD_land_uses$Predominant_habitat, TPD_land_uses$Realm)
##
## Afrotropic Australasia Indo-Malay Nearctic Neotropic
## Cropland 75 1 20 16 18
## Pasture 20 22 0 28 68
## Plantation forest 89 3 119 3 32
## Primary vegetation 163 57 78 85 86
## Secondary vegetation 99 25 21 0 55
## Urban 9 11 4 29 40
##
## Palearctic
## Cropland 23
## Pasture 26
## Plantation forest 161
## Primary vegetation 106
## Secondary vegetation 110
## Urban 30
land_uses <-
c(
"Primary vegetation",
"Secondary vegetation",
"Pasture",
"Cropland",
"Plantation forest",
"Urban"
)
realms <-
c("Neotropic",
"Afrotropic",
"Palearctic",
"Nearctic",
"Indo-Malay",
"Australasia")
land_use_colours <-
data.frame(
land_use = land_uses,
colours = c(
"chartreuse4",
"olivedrab2",
"#EBF787",
"#E3D438",
"springgreen2",
"#718879"
)
)
rownames(land_use_colours) <- land_uses
This analysis will be based on the Land-Use Realm system hypervolumes to be able to more clearly reveal geomertic patterns, which at the site level is just too noisy and suffers from data limitations.
Now need to exclude some Land-Use Realm hypervolumes that were too data poor to get reliable measures. Also to facilitate modelling I scale some variables.
realm_level_hole_frame$land_use <-
factor(
realm_level_hole_frame$land_use,
levels = c(
"Primary vegetation",
"Secondary vegetation",
"Plantation forest",
"Pasture",
"Cropland",
"Urban"
)
)
modelling_hole_dataframe <-
realm_level_hole_frame[-which(
realm_level_hole_frame$land_use == "Urban" &
realm_level_hole_frame$realm == "Neotropic" |
realm_level_hole_frame$land_use == "Secondary vegetation" &
realm_level_hole_frame$realm == "Nearctic" |
realm_level_hole_frame$land_use == "Plantation forest" &
realm_level_hole_frame$realm == "Nearctic" |
realm_level_hole_frame$land_use == "Urban" &
realm_level_hole_frame$realm == "Australasia" |
realm_level_hole_frame$land_use == "Plantation forest" &
realm_level_hole_frame$realm == "Australasia" |
realm_level_hole_frame$land_use == "Cropland" &
realm_level_hole_frame$realm == "Australasia" |
realm_level_hole_frame$land_use == "Pasture" &
realm_level_hole_frame$realm == "Indo-Malay" |
realm_level_hole_frame$land_use == "Urban" &
realm_level_hole_frame$realm == "Indo-Malay"
), ]
## Let's have a look at the total hole volume
hist(scale(modelling_hole_dataframe$total_hole_volume), breaks = 20)
hist(scale(sqrt(modelling_hole_dataframe$total_hole_volume)), breaks = 20)
hist(scale(log(modelling_hole_dataframe$total_hole_volume)), breaks = 20)
### out of these three I think the sqrt transformation is the best
## looks okay let's just scale it to have a standard deviation of 1 and a mean of 0
modelling_hole_dataframe$total_hole_volume <- scale(sqrt(modelling_hole_dataframe$total_hole_volume))[,1]
## the size of the observed hypervolume
hist(scale(modelling_hole_dataframe$hypervolume_occupancy))
## okay maybe could use a transformation
hist(scale(log(modelling_hole_dataframe$hypervolume_occupancy)))
## log probably looks best
modelling_hole_dataframe$hypervolume_occupancy <- scale(log(modelling_hole_dataframe$hypervolume_occupancy))[,1]
source("https://highstat.com/Books/Book2/HighstatLibV10.R")
corvif(modelling_hole_dataframe[,c("total_hole_volume","hypervolume_occupancy","land_use")])
##
##
## Variance inflation factors
##
## GVIF Df GVIF^(1/2Df)
## total_hole_volume 2.287586 1 1.512477
## hypervolume_occupancy 2.826103 1 1.681102
## land_use 1.732807 5 1.056513
## brilliant this shows that there is no multi-colinearity so good to go ahead with the modelling
Before I start modelling I would like to look at what sort of relationship the variables have with each other, for example the radius of hole detection is not likely to have a linear relationship with total hole volume as it will initially increase sharply with radius but then plateau when all unoccupied space is considered to be part of a hole.
So to have a look at this we
### relationship between radius and hole volume
radius_hole_volume <- ggplot(data = modelling_hole_dataframe, aes(x = radius, y = total_hole_volume, colour = land_use))+
geom_point() +
facet_grid(~realm)
plot(radius_hole_volume)
## right this looks non-linear so looking like we are going to need a non-linear modelling approach I'm thinkin generalised linear models (GAMs)
hole_volume_occupancy <- ggplot(data = modelling_hole_dataframe, aes(x = hypervolume_occupancy, y = total_hole_volume, colour = land_use)) +
geom_point()
plot(hole_volume_occupancy)
## Just looking at the top values here the realtionship is looking a lot more linear with increase observed hypervolume size the larger the observed hole may be.
Considering the relationships between the variables I think the model to explore the influence of land use on the internal structure of avian trait space will take the form of…
A generalised additive model (GAM) taking total hole volume as a function of land use, the detection radius of hole as a smoothed variable, observed hypervolume size as a linear variable and the interaction of both with land use.
hole_volume_gam <- mgcv::gam(
total_hole_volume ~ s(radius) +
s(radius, by = land_use) +
hypervolume_occupancy +
#te(hypervolume_occupancy,radius)+
hypervolume_occupancy:land_use +
land_use,
data = modelling_hole_dataframe,
method = "REML"
)
summary(hole_volume_gam)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## total_hole_volume ~ s(radius) + s(radius, by = land_use) + hypervolume_occupancy +
## hypervolume_occupancy:land_use + land_use
##
## Parametric coefficients:
## Estimate Std. Error t value
## (Intercept) -0.49343 0.02645 -18.652
## hypervolume_occupancy 0.75796 0.02658 28.519
## land_useSecondary vegetation 0.57556 0.03563 16.152
## land_usePlantation forest 0.69090 0.05214 13.250
## land_usePasture 0.69337 0.03478 19.935
## land_useCropland 0.67763 0.03425 19.786
## land_useUrban 0.38402 0.15487 2.480
## hypervolume_occupancy:land_useSecondary vegetation -0.20490 0.03922 -5.224
## hypervolume_occupancy:land_usePlantation forest -0.05633 0.04762 -1.183
## hypervolume_occupancy:land_usePasture 0.01062 0.03504 0.303
## hypervolume_occupancy:land_useCropland 0.10885 0.03948 2.757
## hypervolume_occupancy:land_useUrban -0.00640 0.05427 -0.118
## Pr(>|t|)
## (Intercept) < 2e-16 ***
## hypervolume_occupancy < 2e-16 ***
## land_useSecondary vegetation < 2e-16 ***
## land_usePlantation forest < 2e-16 ***
## land_usePasture < 2e-16 ***
## land_useCropland < 2e-16 ***
## land_useUrban 0.01325 *
## hypervolume_occupancy:land_useSecondary vegetation 1.96e-07 ***
## hypervolume_occupancy:land_usePlantation forest 0.23694
## hypervolume_occupancy:land_usePasture 0.76182
## hypervolume_occupancy:land_useCropland 0.00589 **
## hypervolume_occupancy:land_useUrban 0.90615
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df F p-value
## s(radius) 8.7588867 8.9659331 157.147 < 2e-16 ***
## s(radius):land_usePrimary vegetation 1.0006844 1.0011694 1.190 0.27559
## s(radius):land_useSecondary vegetation 2.9146880 3.6236653 2.815 0.02999 *
## s(radius):land_usePlantation forest 0.0004687 0.0009231 0.044 0.99490
## s(radius):land_usePasture 1.5149511 1.8577096 0.414 0.56726
## s(radius):land_useCropland 3.2442492 4.0353832 3.970 0.00285 **
## s(radius):land_useUrban 3.8614894 4.5286250 7.811 7.38e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Rank: 74/75
## R-sq.(adj) = 0.832 Deviance explained = 83.5%
## -REML = 1018.4 Scale est. = 0.1682 n = 1802
This model shows that holes are likely to larger is avian trait spaces of bird communities in all other land uses compared to primary vegetation, significantly so in all land uses other than urban. The size of the observed hypervolume and hole detection radius also have significant effects on the total hole volume, unsurprisingly the larger the observed hypervolume and detection radius the larger the holes. Their interactions with land use are also significant.
Some interesting interactions going on here with urban holes becoming smaller as observed hypervolume size increases, however observed hypervolume size for urban LURs are all typically very small.
But, lets get some visualisations to aid us in the interpretations of the model. first let’s have a look at the effect of the hole detection radius on the total hole volume for each land use. To predict the model I have kept the hypervolume occupancy as the median hypervolume occupancy observed across all viable LUR combinations.
gamm_plot_radius <- c()
for (land_use in land_uses) {
land_use_data <-
modelling_hole_dataframe[modelling_hole_dataframe$land_use == land_use, "radius"]
#hyper_size <- range(unique(realm_level_hole_frame_2[realm_level_hole_frame_2$land_use == land_use, "hypervolume_occupancy"]))
#hyper_size <- seq(hyper_size[1],hyper_size[2], length.out = 100)
for (i in land_use_data) {
# median_volume <- median(unique(modelling_hole_dataframe[modelling_hole_dataframe$land_use == land_use,"hypervolume_occupancy"]))
median_volume <-
median(unique(modelling_hole_dataframe$hypervolume_occupancy))
data <- data.frame(
radius = i,
land_use = land_use,
predict(
hole_volume_gam,
newdata = data.frame(
radius = i,
land_use = land_use,
hypervolume_occupancy = median_volume
),
se.fit = TRUE
)
)
gamm_plot_radius <- rbind(gamm_plot_radius, data)
}
}
gamm_plot_radius$land_use <-
factor(
gamm_plot_radius$land_use,
levels = c(
"Primary vegetation",
"Secondary vegetation",
"Pasture",
"Cropland",
"Plantation forest",
"Urban"
)
)
gamm_plot_radius$upper <-
gamm_plot_radius$fit + gamm_plot_radius$se.fit
gamm_plot_radius$lower <-
gamm_plot_radius$fit - gamm_plot_radius$se.fit
radius_volume_plot <-
ggplot(data = gamm_plot_radius, aes(x = radius, y = fit, group = land_use)) +
#geom_point(data = realm_level_radius_data, aes( x = radius, y = mean_hole_volume, colour = land_use), alpha = 0.7, size = 3) +
geom_line(size = 1.5,aes(colour = land_use)) +
geom_ribbon(aes(
ymin = lower,
ymax = upper,
fill = land_use
),
alpha = 0.5, show.legend = FALSE) +
scale_colour_manual(values = land_use_colours[as.character(unique(gamm_plot_radius$land_use)), "colours"]) +
scale_fill_manual(values = land_use_colours[as.character(unique(gamm_plot_radius$land_use)), "colours"]) +
theme(panel.background = element_rect(fill = 'grey', color = 'grey'),
panel.grid.major = element_line(color = 'grey'),
panel.grid.minor = element_line(color = 'grey')) +
xlab("Radius") +
ylab("Total Hole Volume") +
ylim(-4,3)
plot(radius_volume_plot)
This plot looks encouraging that at the median observed hypervolume size that compared to primary vegetation all other land uses are predicted to have larger holes at all hole detection radius values. Interestingly again Urban bird communities are predicted to have the second smallest holes at the median hypervolume occupancy, however, this may not be too unexpected as urban Land-Use Realm systems typically have small observed hypervolume sizes that may be susceptible to functional homogenisation and these results may be indicative of that.
To get a clearer view of the interaction between land use and radius, and hypervolume occupancy, here is a animation of how the relationship between radius and predicted hole volume differs with different values of inital observed hypervolume size, lines come in when the occupancy is within the range of observed hypervolume occupancy values. One to note is that Urban sites drop out early due to consistently small occupancy values being observed. However, again primary vegetation maintains the smallest holes compared to other land uses irrespective of the oberved hypervolume size.
my animated GIF
Second visualations will be to show the predictions of hole size with observed hypervolume size. Akin to the other plot I have predicted values iterating through hypervolume size with radius being constant at the median value displayed.
gamm_plot_hypervolume_occupancy <- c()
for (land_use in land_uses) {
#land_use_data <- realm_level_hole_frame_2[realm_level_hole_frame_2$land_use == land_use,"radius"]
hyper_size <-
range(unique(modelling_hole_dataframe[modelling_hole_dataframe$land_use == land_use, "hypervolume_occupancy"]))
hyper_size <- seq(hyper_size[1], hyper_size[2], length.out = 100)
for (i in hyper_size) {
median_radius <-
round(median(unique(modelling_hole_dataframe[modelling_hole_dataframe$land_use == land_use, "radius"])), digits = 2)
# mean_volume <- median(unique(realm_level_hole_frame_2$hypervolume_occupancy))
#mean_radius <- round(median(unique(realm_level_hole_frame_2$radius)),digits = 2)
data <- data.frame(
hypervolume_occupancy = i,
land_use = land_use,
predict(
hole_volume_gam,
newdata = data.frame(
radius = median_radius,
land_use = land_use,
hypervolume_occupancy = i
),
se.fit = TRUE
)
)
gamm_plot_hypervolume_occupancy <-
rbind(gamm_plot_hypervolume_occupancy, data)
}
}
gamm_plot_hypervolume_occupancy$land_use <-
factor(
gamm_plot_hypervolume_occupancy$land_use,
levels = c(
"Primary vegetation",
"Secondary vegetation",
"Pasture",
"Cropland",
"Plantation forest",
"Urban"
)
)
gamm_plot_hypervolume_occupancy$upper <-
gamm_plot_hypervolume_occupancy$fit + gamm_plot_hypervolume_occupancy$se.fit
gamm_plot_hypervolume_occupancy$lower <-
gamm_plot_hypervolume_occupancy$fit - gamm_plot_hypervolume_occupancy$se.fit
radius_points <- c()
for (land_use in land_uses) {
mean_radius <-
round(median(unique(modelling_hole_dataframe[modelling_hole_dataframe$land_use == land_use, "radius"])), digits = 2)
radius_data <-
modelling_hole_dataframe %>% dplyr::mutate(radius = as.character(radius)) %>%
dplyr::filter(radius == as.character(median_radius))
radius_data <- radius_data[radius_data$land_use == land_use,]
radius_points <- rbind(radius_points, radius_data)
}
gamm_plot_hypervolume_occupancy <- gamm_plot_hypervolume_occupancy %>% dplyr::filter(land_use %in% as.character(unique(radius_points$land_use)))
hypervolume_hole_plot <-
ggplot(data = gamm_plot_hypervolume_occupancy, aes(x = hypervolume_occupancy, y = fit, group = land_use)) +
geom_line(size = 1.5,aes(colour = land_use)) +
geom_ribbon(
aes(
ymin = lower,
ymax = upper,
fill = land_use
),
alpha = 0.6,
show.legend = FALSE
) +
geom_point(
data = radius_points,
aes(x = hypervolume_occupancy, y = total_hole_volume, colour = land_use)
,
size = 8,
alpha = 0.6,
show.legend = FALSE
) +
scale_colour_manual(values = land_use_colours[as.character(unique(gamm_plot_hypervolume_occupancy$land_use)), "colours"]) +
scale_fill_manual(values = land_use_colours[as.character(unique(gamm_plot_hypervolume_occupancy$land_use)), "colours"]) +
ylab("Total Hole Volume") +
xlab("Hypervolume occupancy") +
theme(panel.background = element_rect(fill = 'grey', color = 'grey'),
panel.grid.major = element_line(color = 'grey'),
panel.grid.minor = element_line(color = 'grey')) +
ylim(-4,3)+
xlim(-3,2)
plot(hypervolume_hole_plot)
So again similarly to the radius-hole plot compared to primary vegetation that all other land uses are predicted to have larger holes irrespective of the inital hypervolume size. Predictions are limited by the observed hypervolyume size of the Land-Use Realm hypervolumes.
Next to observed the plots with varying radius values.
Again this shows encouraging results with primary vegetation disaplying consistently smaller holes compared to other land uses.
Another indication of the erosion of the internal structure of avian functional trait spaces in human-domianted land uses would be the number of holes displayed while again taking into account the inital hypervolume size and radius of hole detection.
Again this will be a GAM, but this time with a poisson distribution as we are dealing with count data.
number_of_holes_model <- mgcv::gam(
number_of_holes ~ s(radius) +
s(radius, by = land_use) +
hypervolume_occupancy +
hypervolume_occupancy:land_use +
#te(hypervolume_occupancy,radius)+
# s(hypervolume_occupancy, by = land_use) +
land_use,
data = modelling_hole_dataframe,
family = "poisson",
method = "REML"
)
summary(number_of_holes_model)
##
## Family: poisson
## Link function: log
##
## Formula:
## number_of_holes ~ s(radius) + s(radius, by = land_use) + hypervolume_occupancy +
## hypervolume_occupancy:land_use + land_use
##
## Parametric coefficients:
## Estimate Std. Error z value
## (Intercept) 0.80428 0.04157 19.349
## hypervolume_occupancy 0.45368 0.02661 17.049
## land_useSecondary vegetation 0.13193 0.06206 2.126
## land_usePlantation forest 0.04854 0.30067 0.161
## land_usePasture 0.29093 0.05459 5.329
## land_useCropland 0.28134 0.05410 5.201
## land_useUrban -0.04652 0.13995 -0.332
## hypervolume_occupancy:land_useSecondary vegetation -0.08471 0.03758 -2.254
## hypervolume_occupancy:land_usePlantation forest 0.07396 0.04729 1.564
## hypervolume_occupancy:land_usePasture -0.09023 0.03628 -2.487
## hypervolume_occupancy:land_useCropland -0.13420 0.04096 -3.277
## hypervolume_occupancy:land_useUrban -0.48596 0.06962 -6.980
## Pr(>|z|)
## (Intercept) < 2e-16 ***
## hypervolume_occupancy < 2e-16 ***
## land_useSecondary vegetation 0.03352 *
## land_usePlantation forest 0.87176
## land_usePasture 9.86e-08 ***
## land_useCropland 1.99e-07 ***
## land_useUrban 0.73958
## hypervolume_occupancy:land_useSecondary vegetation 0.02420 *
## hypervolume_occupancy:land_usePlantation forest 0.11781
## hypervolume_occupancy:land_usePasture 0.01289 *
## hypervolume_occupancy:land_useCropland 0.00105 **
## hypervolume_occupancy:land_useUrban 2.94e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df Chi.sq p-value
## s(radius) 6.6142 7.524 499.232 < 2e-16 ***
## s(radius):land_usePrimary vegetation 4.8974 5.809 19.639 0.003400 **
## s(radius):land_useSecondary vegetation 5.4335 6.335 42.111 2.3e-06 ***
## s(radius):land_usePlantation forest 3.3606 3.869 21.215 0.000196 ***
## s(radius):land_usePasture 1.1849 1.340 2.175 0.151987
## s(radius):land_useCropland 1.0032 1.006 2.072 0.151315
## s(radius):land_useUrban 0.6563 1.049 0.068 0.887027
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Rank: 74/75
## R-sq.(adj) = 0.892 Deviance explained = 91.1%
## -REML = 3207.2 Scale est. = 1 n = 1802
Then additonally, with the number of holes model, compared to primary vegetation bird communities in other land uses typically have a larger number of holes, usually significantly so. However, with the exception of urban communities. However, there is a significant interaction between observed hypervolume size in the opposite direction, which would suggest that the negative overall effect of urban communities is due to the small observed hypervolume size and that they would possibly exhibit a greater number of holes with larger size.